package com.huawei.user.service;


import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.huawei.user.VO.UserVO;
import com.huawei.user.entry.User;
import com.huawei.user.mapper.UserMapper;
import com.huawei.user.util.RedisUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    public UserMapper userMapper;

    @Autowired
    RedisUtil redisUtil;

    @Autowired
    SendMessageService sendMessage;

    public User getUser(String phone, String region) {
       //根据用户所在地查询对应数据库
        User user =selectUser(phone);

        //如果没有查到，就读取缓存
        if(user==null && redisUtil.exists(phone)){
            user =  JSONObject.parseObject(redisUtil.get(phone).toString(), User.class);
        }

        //region等于all，表示是通过缓存查询当前区域的数据，不需要在通过异步查询其他区域数据库
        if(region.equals("all")){
            return user;
        }

        //如果缓存没有,异步查询其他分区数据并且更新缓，每隔1一秒查询一次缓存
        if(user == null){
            sendMessage(phone);
            //每隔一秒查询缓存，5次没有就返回null
            for(int i=0;i<5;i++){
                if(redisUtil.exists(phone)) {
                    user =  JSONObject.parseObject(redisUtil.get(phone).toString(), User.class);
                    break;
                }
                try{
                    Thread.sleep(1000);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }
        return user;
    }


    // 查询数据库中用户信息
    public User selectUser(String phone) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("phone", phone);
        User user = userMapper.selectOne(queryWrapper);
        return user;
    }

    //通过mq发送消息更新缓存
    public void sendMessage(String phone){
        try {
            sendMessage.sendQueryUserMessage(phone);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



    public void updateUser(UserVO userVO){
        //删除缓存
        redisUtil.remove(userVO.getPhone());
        //查询用户是否在当前对应的数据库
        User oldUser = selectUser(userVO.getPhone());
        if (oldUser != null) {
            //直接更新数据库
            UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
            updateWrapper.eq("phone", userVO.getPhone());
            User user = new User();
            BeanUtils.copyProperties(userVO, user);
            userMapper.update(user, updateWrapper);
        }else{
            //如果通过缓存调用，则不需要继续发送消息到缓存
            if(!"all".equals(userVO.getRegion())){
                //发送消息到mq，更新用户信息
                sendMessage.sendUpdateUserMessage(userVO);
            }
        }
    }
}
